﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BTO;
using TISModel;

namespace DAL
{
    public class DALAlojamento
    {
        public List<BTO.Alojamento> list() 
        { 
            //pesquisa dados 
            var alojamentoEntities = new TISModel.TISEntities();

            //Cria modelos e adiciona na lista para retornar
            var alojamentos = (from c in alojamentoEntities.Alojamento
                               select new BTO.Alojamento{
                                    IDAlojamento = c.IDAlojamento,
                                    nome = c.nome,
                                    morada = c.morada,
                                    IDTipoAlojamento = c.IDTipoAlojamento,
                                    lotacao = c.lotacao,
                                    telefone = c.telefone,
                                    email = c.email,
                                    IDLocal = c.IDLocal,
                                    IDCategoria = c.IDCategoria
                               }).ToList();

            return alojamentos;
        }

        public BTO.Alojamento getByID(int? id) {
            //Pesquisa dados e cria modelo para retornar
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamento = (from c in alojamentoEntities.Alojamento
                           where c.IDAlojamento == id
                           select new BTO.Alojamento
                           {
                               IDAlojamento = c.IDAlojamento,
                               nome = c.nome,
                               morada = c.morada,
                               IDTipoAlojamento = c.IDTipoAlojamento,
                               lotacao = c.lotacao,
                               telefone = c.telefone,
                               email = c.email,
                               IDLocal = c.IDLocal,
                               IDCategoria = c.IDCategoria

                           }).FirstOrDefault();

            return alojamento;
            
        }

        public BTO.Alojamento getByNome(String nome)
        {
            //Pesquisa dados e cria modelo para retornar
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamento = (from c in alojamentoEntities.Alojamento
                              where c.nome == nome
                              select new BTO.Alojamento
                              {
                                  IDAlojamento = c.IDAlojamento,
                                  nome = c.nome,
                                  morada = c.morada,
                                  IDTipoAlojamento = c.IDTipoAlojamento,
                                  lotacao = c.lotacao,
                                  telefone = c.telefone,
                                  email = c.email,
                                  IDLocal = c.IDLocal,
                                  IDCategoria = c.IDCategoria

                              }).FirstOrDefault();

            return alojamento;

        }

        public List<BTO.Alojamento> getByIDLocal(int idLocal)
        {
            //Pesquisa dados e cria modelo para retornar
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamentos = (from c in alojamentoEntities.Alojamento
                               where c.IDLocal == idLocal
                               select new BTO.Alojamento
                               {
                                   IDAlojamento = c.IDAlojamento,
                                   nome = c.nome,
                                   morada = c.morada,
                                   IDTipoAlojamento = c.IDTipoAlojamento,
                                   lotacao = c.lotacao,
                                   telefone = c.telefone,
                                   email = c.email,
                                   IDLocal = c.IDLocal,
                                   IDCategoria = c.IDCategoria

                               }).ToList();

            return alojamentos;
        }

        public List<BTO.Alojamento> getByTipoAlojamento (int tipoAlojamento)
        {
            //Pesquisa dados e cria modelo para retornar
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamentos = (from c in alojamentoEntities.Alojamento
                              where c.IDTipoAlojamento == tipoAlojamento
                              select new BTO.Alojamento
                              {
                                  IDAlojamento = c.IDAlojamento,
                                  nome = c.nome,
                                  morada = c.morada,
                                  IDTipoAlojamento = c.IDTipoAlojamento,
                                  lotacao = c.lotacao,
                                  telefone = c.telefone,
                                  email = c.email,
                                  IDLocal = c.IDLocal,
                                  IDCategoria = c.IDCategoria

                              }).ToList();

            return alojamentos;
        }

        public List<BTO.Alojamento> getByCategoria(int idCategoriaAlojamento)
        {
            //Pesquisa dados e cria modelo para retornar
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamentos = (from c in alojamentoEntities.Alojamento
                               where c.IDCategoria == idCategoriaAlojamento
                           select new BTO.Alojamento
                           {
                               IDAlojamento = c.IDAlojamento,
                               nome = c.nome,
                               morada = c.morada,
                               IDTipoAlojamento = c.IDTipoAlojamento,
                               lotacao = c.lotacao,
                               telefone = c.telefone,
                               email = c.email,
                               IDLocal = c.IDLocal,
                               IDCategoria = c.IDCategoria

                           }).ToList();

            return alojamentos;
        }


        public void insert(BTO.Alojamento toInsert)
        {
            try
            {
                //cria um entity model e guarda
                var alojamentoEntities = new TISModel.TISEntities();

                TISModel.Alojamento alojamento = new TISModel.Alojamento();
                                 
                alojamento.nome = toInsert.nome;
                alojamento.morada = toInsert.morada;
                alojamento.IDTipoAlojamento = toInsert.IDTipoAlojamento;
                alojamento.lotacao = toInsert.lotacao;
                alojamento.telefone = toInsert.telefone;
                alojamento.email = toInsert.email;
                alojamento.IDLocal = toInsert.IDLocal;
                alojamento.IDCategoria = toInsert.IDCategoria;

                alojamentoEntities.AddToAlojamento(alojamento);
                alojamentoEntities.SaveChanges();

            }
            catch (Exception)
            {
                throw new System.Exception("Não foi Possível inserir o alojamento!");
            }
        }

        public void update(BTO.Alojamento toUpdate)
        {
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamento = (from c in alojamentoEntities.Alojamento
                                where c.IDAlojamento == toUpdate.IDAlojamento select c).FirstOrDefault();

            if (alojamento != null)
            {
                try
                {
                    alojamento.nome = toUpdate.nome;
                    alojamento.morada = toUpdate.morada;
                    alojamento.IDTipoAlojamento = toUpdate.IDTipoAlojamento;
                    alojamento.lotacao = toUpdate.lotacao;
                    alojamento.telefone = toUpdate.telefone;
                    alojamento.email = toUpdate.email;
                    alojamento.IDLocal = toUpdate.IDLocal;
                    alojamento.IDCategoria = toUpdate.IDCategoria;

                    alojamentoEntities.SaveChanges();
                }
                catch (Exception)
                {
                    throw new System.Exception("Não foi Possível actualizar o alojamento!");
                }

            }
            else {
                throw new System.Exception("Alojamento não encontrado!");
            }
            
        }

        public void delete(int id)
        {
            var alojamentoEntities = new TISModel.TISEntities();
            var alojamento = (from c in alojamentoEntities.Alojamento where c.IDAlojamento == id select c).FirstOrDefault();

            if (alojamento != null)
            {
                try
                {
                    alojamentoEntities.DeleteObject(alojamento);
                    alojamentoEntities.SaveChanges();
                }
                catch (Exception)
                {
                    throw new System.Exception("Não foi Possível remover o alojamento!");
                }
            }
            else
            {
                throw new System.Exception("Alojamento não encontrado!");
            }

        }
    }
}
